package com.fy.tt.remote.service.impl;

import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.fy.basejar.remote.parameter.WtbCoreParameter;
import com.fy.basejar.remote.parameter.WtbStoreParameter;
import com.fy.basejar.remote.service.BaseRemoteService;
import com.fy.basejar.remote.service.BaseRemoteService.ToolRemoteServiceBase;
import com.fy.basejar.remote.util.RemoteRequestUtils;
import com.fy.toolhelper.remote.IHttpProcessResolver;
import com.fy.toolhelper.remote.IHttpResultResolver;
import com.fy.tt.remote.service.ITemplateRemoteService;

/**
 * 根据远程请求的项目区分RemoteService
 * 默认的连接器基于HttpClient实现的, 并定义一套接口, 开发者继承{@link BaseRemoteServiceImpl}来获取CONNECTOR属性(静态变量).
 * 一般需要提供两个处理器: {@link IHttpProcessResolver}和 {@link IHttpResultResolver}以处理各个请求过程中通用的代码.
 * {@link BaseRemoteService}内置了三个写好的请求模板, 开发者选用即可:
 * {@link WtbCoreRemoteServiceBase} 请求吾托帮核心的处理, 注意: 吾托帮核心的通用查询参数封装在{@link WtbCoreParameter}中了, 直接使用即可.
 * {@link WtbStoreRemoteServiceBase} 请求吾托帮商城的处理, 注意: 吾托帮商城的通用查询参数封装在{@link WtbStoreParameter}中了, 直接使用即可.
 * {@link ToolRemoteServiceBase} 请求运行其它工具的处理
 * 如果有其它请求的需要, 请继承{@link BaseRemoteService}重写相应回调即可.
 */
public class TemplateRemoteServiceImpl extends ToolRemoteServiceBase implements ITemplateRemoteService {

	@Override
	public JSONObject remoteQuest(String accessToken/*, WtbStoreParameter storeParam*/) throws Exception {
		Map<String, Object> params = new HashMap<String, Object>();
		// 如果使用了WtbCoreParameter或WtbStoreParameter, 则应这样获取请求参数Map实例
		Map<String, Object> params1 = RemoteRequestUtils.getNotNullableQueryParams(new WtbCoreParameter());
		/* 为了减少代码量, 所有的动态查询参数参数请暴露给Service接口调用者自己设置, 如上面的参数列表注释的部分那样定义接口 */
		/* 如page, count等这种分页参数都封装在动态参数封装类中处理了, 不需要自己传, <strong>请注意其构造函数, 提供了有用的适配功能</strong> */
		/* 如果动态参数允许为null, 请使用getNullableQueryParams */
		
		// 使用RemoteRequestUtils添加参数(封装了自动JSON类型转换和非空值验证验证)
		RemoteRequestUtils.addNotNullableParam(params1, "key1", "value1");
		// RemoteRequestUtils.addNullableParam(params1, "key1", "value1");
		// ... 规则请查看源码
		
		/* 使用CONNECTOR调用的格式基本就是这样, 这里是工具远程请求(继承了ToolRemoteServiceBase),
		 *  所以第三个参数根据ToolRemoteServiceBase中PROCESS的定义, 这里是工具运行参数字符串
		 *  支持REST风格URI, 使用{?}占位符即可. 例如: CONNECTOR.doGet(..., "/user/{?}", userID); */
		return CONNECTOR.doGet(PROCESS, JSON_RESULT,
				"{\"action\":\"getSomething\"}", params);
	}
	/* 如果需要自定义{@link IHttpResultResolver}处理除了JSON以外的远程请求返回结果, 
	 *  则注意使用{@link RemoteResponseUtils}进行返回结果的处理 */
}
